iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 15
0

今天來繼續分享BlueRemedy中使用到的主角攻擊系統。我們將主角的攻擊設定為三段式攻擊,按第一下攻擊鍵會使出第一段、第二下就打出第二段、第三下第三段...,其中還有設定一個輸入延遲的機制,讓玩家能更順暢地打出攻擊。

首先要先設定主角的三段攻擊動畫、在這篇章會稍微提到攻擊動畫設定的部分,因為這和攻擊系統有極大關聯。


Step1:

在開始設定動畫前,我們需要先在OKA底下新增一個攻擊範圍的trigger物件。
https://ithelp.ithome.com.tw/upload/images/20200914/201304144LtNcE5Z3b.jpghttps://ithelp.ithome.com.tw/upload/images/20200914/201304149mwG6JtJlC.jpghttps://ithelp.ithome.com.tw/upload/images/20200914/20130414Pk1m3oj6lj.jpg

Step2:

接下來設定動畫,共有三段動畫(因為有三段攻擊,每段攻擊各有一個animation),在動畫中除了設定sprite的動畫,更重要的是調整attackTrigger每一偵的大小及位置。

至於animator中的設定則是setTrigger(“attack_1”)時播放第一段動畫,撥放完畢後回到IDLE狀態、然後setTrigger(“attack_2”)時播放第二段動畫...,主要的控管都是在程式腳本內。
https://ithelp.ithome.com.tw/upload/images/20200914/201304147HMPHFRXDF.jpg

Step3:

在Oka物件上我設定了attack腳本,他主要負責以下功能:

  • 讀取玩家輸入
  • 依據輸入次數判斷攻擊段數
  • 每次輸入之間會有個等待緩衝時間,即使玩家點擊較慢也同樣能觸發攻擊
  • 偵測攻擊範圍內可攻擊對象,並造成攻擊
  • 打擊感特效

腳本中需要以下變數
https://ithelp.ithome.com.tw/upload/images/20200914/20130414tuymLZbJtU.jpg

Step4:

在Start中要先將部分變數做初始化
https://ithelp.ithome.com.tw/upload/images/20200914/20130414mm0wZGdxc1.jpg

Step5:

再來要寫一個函式用來控制狀態,attacking適用在這個腳本內部的判斷,另外還有個PlayerStatus.isSkilling的狀態機(昨天提到的)。用函式控制好處是能少寫很多重複的東西,同時也避免漏寫的情況發生。
https://ithelp.ithome.com.tw/upload/images/20200914/20130414blQy5eu1Jf.jpg

Step6:

接著在Update中偵測玩家的輸入,當這個輸入次數大於目前的攻擊階段時,就會觸發再下一次的階段。
https://ithelp.ithome.com.tw/upload/images/20200914/20130414ZGmFoMW4Nw.jpg

Step7:

當呼叫NormalAttack函式時,NormalAttack函式會將攻擊狀態機設為true,並且將攻擊階段增加一,再利用switch判斷去呼叫對應階段的動畫。
https://ithelp.ithome.com.tw/upload/images/20200914/20130414QPKXvYNJs6.jpg

Step8:

同時這時候也會開始輸入緩衝的計時(目前設定0.5秒),假如0.5秒內沒有下一次輸入則將normalattack_step(紀錄階段的函數) 重置為0。
https://ithelp.ithome.com.tw/upload/images/20200914/20130414gVXd5zyRSq.jpg
https://ithelp.ithome.com.tw/upload/images/20200914/20130414TmgDcRKNRE.jpg

Step9:

程式中寫到的BackIdle函式就是將所有相關狀態重置的函式。
https://ithelp.ithome.com.tw/upload/images/20200914/201304146LXAe6Bj8i.jpg

那當成功觸發攻擊動畫後會有甚麼事情呢?

這時候我們要回到animation介面看看

Step10:

我在Oka發出攻擊的那個影格設定了一個event,並由他出發程式中的Damage函式
https://ithelp.ithome.com.tw/upload/images/20200914/20130414RSG4badK42.jpg

這個函式的功能功能有三個

  • 偵測這瞬間在attackTrigger中符合EnemyFilter的物件(也就是偵測有哪些怪物在範圍內),並把它們存到一個陣列中
  • 對範圍內的所有怪物扣血,並往主角面相的方向作擊退效果(這部分要和負責怪物的程式溝通所使用的函式)
  • 在被攻擊的怪物身上製造打擊特效
    https://ithelp.ithome.com.tw/upload/images/20200914/201304148Bi5ZK1UuY.jpg

Step11:

接著在攻擊動畫的結尾在建立一個事件並呼叫ThisStepFinish函式
https://ithelp.ithome.com.tw/upload/images/20200914/20130414O49AB2d66a.jpg

這個函式的用途是告訴程式,這個階段的攻擊結束囉,可以撥放下一個階段了。當然,如果是第三段攻擊的結束那就讓一切回歸原始點。
https://ithelp.ithome.com.tw/upload/images/20200914/20130414HmVhXsWJr6.jpg


到這邊就完成我們的攻擊系統囉,趕快來看看吧!




上面三張GIF是遊戲中個型態的普通攻擊,製作方式都大同小異。通常第三段攻擊我會在animation中放置3、4個呼叫Damge的事件標籤,讓攻擊能有更多下打擊,也更有回饋感!

效果還不錯吧! 讀者也可以自己試試看喔。


上一篇
[Day14] 簡易狀態機
下一篇
[Day16]怪物動畫實作
系列文
Unity遊戲開發與實踐-BlueRemedy內容分享30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言